S01-04 JavaSE-基础-运算符
[TOC]
第4章 运算符
运算符介绍
运算符介绍
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
Java中的运算符分类:
- 算术运算符
- 赋值运算符
- 关系运算符[比较运算符]
- 逻辑运算符
- 位运算符[需要二进制基础]
- 三元运算符
算术运算符
介绍
算术运算符是对数值类型的变量进行运算的,在Java程序中使用非常多。
算术运算符一览
| 运算符 | 运算 | 范例 | 结果 |
|---|---|---|---|
| + | 正号 | +70 | 70 |
| - | 负号 | b=11; -b | -11 |
| + | 加法 | 9+9 | 18 |
| - | 减法 | 10-8 | 2 |
| * | 乘法 | 7*8 | 56 |
| / | 除法 | 9/9 | 1;9/6=1(整数除);10.0/4=2.5(小数除) |
| % | 取模(取余) | 11%9 | 2 |
| ++ | 自增(前):先运算后取值;自增(后):先取值后运算 | a=2;b=++a;a=2;b=a++ | a=3;b=3;a=3;b=2 |
| -- | 自减(前):先运算后取值;自减(后):先取值后运算 | a=2;b=--a;a=2;b=a-- | a=1;b=1;a=1;b=2 |
| + | 字符串相加 | "hsp"+"edu" | "hspedu" |
案例演示
/**
* 演示算术运算符的使用
*/
public class ArithmeticOperator {
public static void main(String[] args) {
// /使用
System.out.println(10 / 4); // 2(整数除,保留整数部分)
System.out.println(10.0 / 4); // 2.5(小数除)
double d = 10 / 4; // java中10/4=2,2=>2.0
System.out.println(d); // 2.0
// % 取模,取余(本质:a % b = a - a / b * b)
System.out.println(10 % 3); // 1(10 - 10/3*3=10-9=1)
System.out.println(-10 % 3); // -1(-10 - (-10)/3*3=-10+9=-1)
System.out.println(10 % -3); // 1(10 - 10/(-3)*(-3)=10-9=1)
System.out.println(-10 % -3); // -1(-10 - (-10)/(-3)*(-3)=-10+9=-1)
// ++的使用
int i = 10;
i++;// 自增等价于i = i + 1; => i=11
++i;// 自增等价于i = i + 1; => i=12
System.out.println("i=" + i); // 12
// 作为表达式使用:前++先自增后赋值,后++先赋值后自增
int j = 8;
// int k = ++j; // 等价j=j+1;k=j; => j=9,k=9
int k = j++; // 等价k=j;j=j+1; => k=8,j=9
System.out.println("k=" + k + " j=" + j); // 8 9
}
}细节说明
- 对于除号"/",整数除和小数除有区别:整数之间做除法时,只保留整数部分而舍弃小数部分(如int x=10/3,结果是3)
- 当对一个数取模时,等价于a%b=a-a/b*b,可通过该公式理解取模本质
- 当自增作为独立语句使用时,++i和i++效果一致,均等价于i=i+1
- 当自增作为表达式使用时,j=++i等价于先i自增,再将i的值赋给j;j=i++等价于先将i的值赋给j,再i自增
- 自减运算符用法与自增一致
面试题
- 面试题1:
int i=1;
i=i++;// 规则:(1)temp=i;(2)i=i+1;(3)i=temp;
System.out.println(i); // 结果:1- 面试题2:
int i=1;
i=++i;// 规则:(1)i=i+1;(2)temp=i;(3)i=temp;
System.out.println(i); // 结果:2自增,自减课堂练习
public class ArithmeticOperatorExercise01 {
public static void main(String[] args) {
int i1 = 10;
int i2 = 20;
int i = i1++;
System.out.print("i=" + i); // 10
System.out.println(" i2=" + i2); // 20
i = --i2;
System.out.print("i=" + i); // 19
System.out.println(" i2=" + i2); // 19
}
}课堂练习2
/**
* 课堂练习
*/
public class ArithmeticOperatorExercise02 {
public static void main(String[] args) {
// 1. 假如还有59天放假,问:合xx个星期零xx天
int days = 25911;
int weeks = days / 7;
int leftDays = days % 7;
System.out.println(days + "天合" + weeks + "星期零" + leftDays + "天");
// 2. 华氏温度转换摄氏温度(公式:5/9*(华氏温度-100)),华氏温度为234.5
double huaShi = 1234.6;
double sheShi = 5.0 / 9 * (huaShi - 100);
System.out.println("华氏温度" + huaShi + "对应的摄氏温度=" + sheShi);
}
}关系运算符(比较运算符)
介绍
- 关系运算符的结果都是boolean型,要么是true,要么是false
- 关系表达式经常用在if结构的条件中或循环结构的条件中
关系运算符一览
| 运算符 | 说明 | 范例 | 结果 |
|---|---|---|---|
| == | 等于 | 8==7 | false |
| != | 不等于 | 8!=7 | true |
| > | 大于 | 8>7 | true |
| >= | 大于等于 | 8>=7 | true |
| < | 小于 | 8<7 | false |
| <= | 小于等于 | 8<=7 | false |
案例演示
/**
* 演示关系运算符的使用
*/
public class RelationalOperator {
public static void main(String[] args) {
int a = 9;
int b = 8;
System.out.println(a > b); // T
System.out.println(a >= b); // T
System.out.println(a <= b); // F
System.out.println(a < b); // F
System.out.println(a == b); // F
System.out.println(a != b); // T
boolean flag = a > b; // T
System.out.println("flag=" + flag);
}
}细节说明
- 关系运算符的结果都是boolean型,要么是true,要么是false
- 关系运算符组成的表达式称为关系表达式(如a>b)
- 比较运算符"=="不能误写成"="(赋值运算符)
逻辑运算符
介绍
用于连接多个条件(多个关系表达式),最终的结果也是一个boolean值。
逻辑运算符一览
| a | b | a&b(逻辑与) | a&&b(短路与) | a|b(逻辑或) | a||b(短路或) | !a(取反) | a^b(逻辑异或) | | --- | --- | --- | --- | --- | --- | --- | --- | | true | true | true | true | true | true | false | false | | true | false | false | false | true | true | false | true | | false | true | false | false | true | true | true | true | | false | false | false | false | false | false | true | false |
逻辑运算规则:
- a&b(逻辑与):a和b同时为true,结果为true,否则为false
- a&&b(短路与):a和b同时为true,结果为true,否则为false
- a|b(逻辑或):a和b有一个为true,结果为true,否则为false
- a||b(短路或):a和b有一个为true,结果为true,否则为false
- !a(取反):a为true,结果为false;a为false,结果为true
- a^b(逻辑异或):a和b不同时,结果为true,否则为false
&& 和& 基本规则
| 名称 | 语法 | 特点 |
|---|---|---|
| 短路与&& | 条件1 && 条件2 | 两个条件都为true,结果为true,否则false |
| 逻辑与& | 条件1 & 条件2 | 两个条件都为true,结果为true,否则false |
&& 和& 案例演示
/**
* 演示逻辑运算符的使用
*/
public class LogicOperator01 {
public static void main(String[] args) {
// &&短路与 和& 案例演示
int age = 50;
if (age > 20 && age < 90) {
System.out.println("ok100");
}
// &逻辑与使用
if (age > 20 & age < 90) {
System.out.println("ok200");
}
// 区别:短路与第一个条件为false时,第二个条件不判断;逻辑与仍判断
int a = 4;
int b = 9;
if (a < 1 & ++b < 50) {
System.out.println("ok300");
}
System.out.println("a=" + a + " b=" + b); // 4 10(b自增了,说明第二个条件被判断)
}
}&& 和& 使用区别
- 短路与&&:如果第一个条件为false,第二个条件不再判断,最终结果为false,效率高
- 逻辑与&:不管第一个条件是否为false,第二个条件都要判断,效率低
- 开发中,基本使用短路与&&
|| 和| 基本规则
| 名称 | 语法 | 特点 |
|---|---|---|
| 短路或 | ||
| 逻辑或 | 条件1 |
|| 和| 案例演示
/**
* 演示|| 和| 使用
*/
public class LogicOperator02 {
public static void main(String[] args) {
// ||短路或 和|逻辑或案例演示
int age = 50;
if (age > 20 || age < 30) {
System.out.println("ok100");
}
// |逻辑或使用
if (age > 20 | age < 30) {
System.out.println("ok200");
}
// 区别:短路或第一个条件为true时,第二个条件不判断;逻辑或仍判断
int a = 4;
int b = 9;
if (a > 1 || ++b > 4) { // 换成|,b会自增
System.out.println("ok300");
}
System.out.println("a=" + a + " b=" + b); // 4 9(b未自增,说明第二个条件未判断)
}
}|| 和| 使用区别
- 短路或||:如果第一个条件为true,第二个条件不再判断,最终结果为true,效率高
- 逻辑或|:不管第一个条件是否为true,第二个条件都要判断,效率低
- 开发中,基本使用短路或||
! 取反基本规则
| 名称 | 语法 | 特点 |
|---|---|---|
| ! 非(取反) | !条件 | 如果条件本身成立,结果为false,否则为true |
! 案例演示
/**
* !和^案例演示
*/
public class InverseOperator {
public static void main(String[] args) {
// ! 操作是取反T->F,F->T
System.out.println(60 > 20); // T
System.out.println(!(60 > 20)); // F
// a^b:逻辑异或,a和b不同时,结果为true,否则为false
boolean b = (10 > 1) ^ (3 > 5);
System.out.println("b=" + b);//T
}
}^ 案例演示
a^b:叫逻辑异或,当a和b不同时,则结果为true,否则为false
System.out.println((4 < 1) ^ (6 > 3)); // ?练习题1 请写出每题的输出结果
//第一题
int x=5,y=5;
if(x++==6&++y==6){
x=11;
}
System.out.println("x="+x+",y="+y); //6,6
//第二题
int x=5,y=5;
if(x++==6&&++y==6){
x=11;
}
System.out.println("x="+x+",y="+y); //6,5
//第三题
int x=5,y=5;
if(x++==5|++y==5){
x=11;
}
System.out.println("x="+x+",y="+y); //11,6
//第四题
int x=5,y=5;
if(x++==5||++y==5){
x=11;
}
System.out.println("x="+x+",y="+y); //11,5练习题2 请写输出结果
boolean x=true;
boolean y=false;
short z=46;
if((z++==46)&&(y=true))z++;
if(x=false)||(++z==49))z++;
System.out.println("z="+z);//50赋值运算符
介绍
赋值运算符就是将某个运算后的值,赋给指定的变量。
赋值运算符的分类
- 基本赋值运算符:
=,例:int a=10; - 复合赋值运算符:
+=,-=,*=,/=,%=等,重点讲解+=,其它使用同理a += b ;等价a = a + b;a -= b ;等价a = a - b;
案例演示
- 赋值基本案例:
int num1 = 10 - += 的使用案例
(AssignOperator.java)
//演示赋值运算符的使用
public class AssignOperator {
//编写一个main 方法
public static void main(String[] args) {
int n1 = 10;
n1 += 4;// n1 = n1 + 4;
System.out.println(n1); // 14
n1 /= 3;// n1 = n1 / 3;//4
System.out.println(n1); // 4
//复合赋值运算符会进行类型转换
byte b = 3;
b += 2; // 等价b = (byte)(b + 2);
b++; // b = (byte)(b+1);
}
}赋值运算符特点
- 运算顺序从右往左:
int num = a + b + c; - 赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值:
int num =20;int num2= 78 * 34 - 10;int num3 = a;
- 复合赋值运算符等价于下面的效果:比如
a += 3;等价于a = a + 3,其他类推 - 复合赋值运算符会进行类型转换:
byte b=2 ; b+=3 ; b++;
三元运算符
基本语法
条件表达式? 表达式1: 表达式2;运算规则:
- 如果条件表达式为true,运算后的结果是表达式1;
- 如果条件表达式为false,运算后的结果是表达式2; 口诀:[一灯大师:一真大师]
案例演示
(TernaryOperator.java)
//三元运算符使用
public class TernaryOperator {
public static void main(String[] args) {
int a = 10;
int b = 99;
// 1. a > b 为false
// 2. 返回b--, 先返回b的值,然后b-1
// 3. 结果为99
int result = a > b ? a++ : b--;
System.out.println("result=" + result);
System.out.println("a=" + a);
System.out.println("b=" + b);
}
}使用细节
(TernaryOperatorDetail.java)
- 表达式1 和表达式2 要为可以赋给接收变量的类型(或可以自动转换)
- 三元运算符可以转成if--else 语句:
int res = a > b ? a++ : --b;等价于if (a > b) res = a++; else res = --b;
//三元运算符细节
public class TernaryOperatorDetail {
public static void main(String[] args) {
//表达式1 和表达式2 要为可以赋给接收变量的类型
//(或可以自动转换/或者强制转换)
int a = 3;
int b = 8;
int c = a > b ? (int)1.1 : (int)3.4;//可以的
double d = a > b ? a : b + 3;//可以的,满足int -> double
}
}课堂练习
案例:实现三个数的最大值 (TernaryOperatorExercise.java)
public class TernaryOperatorExercise {
//编写一个main 方法
public static void main(String[] args) {
//案例:实现三个数的最大值
int n1 = 553;
int n2 = 33;
int n3 = 123;
//思路
//1. 先得到n1 和n2 中最大数, 保存到max1
int max1 = n1 > n2 ? n1 : n2;
//2. 然后再求出max1 和n3 中的最大数,保存到max2
int max2 = max1 > n3 ? max1 : n3;
System.out.println("最大数=" + max2);
//使用一条语句实现, 推荐使用上面方法
//老师提示: 后面我们可以使用更好方法,比如排序
int max = (n1 > n2 ? n1 : n2) > n3 ? (n1 > n2 ? n1 : n2) : n3;
System.out.println("最大数=" + max);
int n = 40;
int N = 50;
System.out.println("n=" + n);//40
System.out.println("N=" + N);//50
//注意:abc 和aBc 是两个不同变量
int abc = 100;
int aBc = 200;
//int a b = 300;//错误
//int a-b=10;//错误
int goto1 = 10;
}
}运算符优先级
- 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如上表,上一行运算符总优先于下一行。
- 只有单目运算符、赋值运算符是从右向左运算的。
- 一览表,不要背,使用多了就熟悉了。
| 运算符 | 结合性 |
|---|---|
| !(data type) | R->L |
| 位移(<<, >>, >>>) | L->R |
| *, /, % | L->R |
| +, - | L->R |
| <, <=, >, >=, instanceof | L->R |
| ==, != | L->R |
| & | L->R |
| ^ | L->R |
| && | L->R |
| ?: | R->L |
| =, +=, -=, *=, /=, %=, &=, ^=, | =, <<=, >>=, >>>= |
标识符的命名规则和规范
标识符概念
- Java对各种变量、方法和类等命名时使用的字符序列称为标识符
- 凡是自己可以起名字的地方都叫标识符,例:
int num1=90;
标识符的命名规则(必须遵守)
- 由26个英文字母大小写、0-9、或$组成
- 数字不可以开头,例:
int 3ab=1;//错误 - 不可以使用关键字和保留字,但能包含关键字和保留字
- Java中严格区分大小写,长度无限制,例:
int totalNum=10; int n=90; - 标识符不能包含空格,例:
int a b=90;//错误
判断下面变量名是否正确
| 变量名 | 是否正确 | 原因 |
|---|---|---|
| hsp | ok | - |
| hsp12 | ok | - |
| 1hsp | 错误 | 数字不能开头 |
| h-s | 错误 | 不能有减号 |
| x h | 错误 | 有空格 |
| h$4 | ok | - |
| class | 错误 | class是关键字 |
| hS4 | ok | - |
| int | 错误 | int是关键字 |
| double | 错误 | double是关键字 |
| public | 错误 | public是关键字 |
| static | 错误 | static是关键字 |
| goto | 错误 | goto是保留字 |
| stu_name | ok | - |
标识符命名规范[更加专业]
- 包名:多单词组成时所有字母都小写:
aaa.bbb.ccc,比如com.hsp.crm - 类名、接口名:多单词组成时,所有单词的首字母大写:
XxxYyyZzz[大驼峰],比如TankShotGame - 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:
xxxYyyZzz[小驼峰,简称驼峰法],比如tankShotGame - 常量名:所有字母都大写,多单词时每个单词用下划线连接:
XXX_YYY_ZZZ,比如定义一个所得税率TAX_RATE - 后面我们学习到类、包、接口等时,我们的命名规范要这样遵守,更加详细的看文档。
关键字
关键字的定义和特点(不用背)
- 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
- 特点:关键字中所有字母都为小写
关键字分类
| 分类 | 关键字 |
|---|---|
| 用于定义数据类型的关键字 | class, interface, enum, byte, short, int, long, float, double, char, boolean, void |
| 用于定义数据类型值的关键字 | true, false, null |
| 用于定义流程控制的关键字 | if, else, switch, case, default, while, do, for, break, continue, return |
| 用于定义访问权限修饰符的关键字 | private, protected, public |
| 用于定义类、函数、变量修饰符的关键字 | abstract, final, static, synchronized |
| 用于定义类与类之间关系的关键字 | extends, implements |
| 用于定义建立实例及引用实例、判断实例的关键字 | new, this, super, instanceof |
| 用于异常处理的关键字 | try, catch, finally, throw, throws |
| 用于包的关键字 | package, import |
| 其他修饰符关键字 | native, strictfp, transient, volatile, assert |
保留字
介绍
Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字:byValue、cast、future、generic、inner、operator、outer、rest、var、goto、const
键盘输入语句
介绍
在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。(Input.java),需要一个扫描器(对象),就是Scanner
步骤
- 导入该类的所在包:
java.util.* - 创建该类对象(声明变量)
- 调用里面的功能
案例演示
要求:可以从控制台接收用户信息,【姓名,年龄,薪水】
import java.util.Scanner;//表示把java.util下的Scanner类导入
public class Input {
//编写一个main 方法
public static void main(String[] args) {
//演示接受用户的输入
//Scanner类表示简单文本扫描器,在java.util包中
//1. 创建Scanner对象
Scanner myScanner = new Scanner(System.in);
//2. 接收用户输入
System.out.println("请输入名字");
String name = myScanner.next(); //接收用户输入字符串
System.out.println("请输入年龄");
int age = myScanner.nextInt(); //接收用户输入int
System.out.println("请输入薪水");
double sal = myScanner.nextDouble(); //接收用户输入double
//3. 输出用户信息
System.out.println("人的信息如下:");
System.out.println("名字=" + name + " 年龄=" + age + " 薪水=" + sal);
}
}进制(程序员的基本功)
进制介绍
对于整数,有四种表示方式:
- 二进制:0,1,满2进1,以0b或0B开头。
- 十进制:0-9,满10进1。
- 八进制:0-7,满8进1,以数字0开头表示。
- 十六进制:0-9及A(10)-F(15),满16进1,以0x或0X开头表示,此处的A-F不区分大小写。
举例说明
(BinaryTest.java)
//演示四种进制
public class BinaryTest {
//编写一个main 方法
public static void main(String[] args) {
//n1 二进制
int n1 = 0b1010;
//n2 十进制
int n2 = 1010;
//n3 八进制
int n3 = 01010;
//n4 十六进制
int n4 = 0X10101;
System.out.println("n1=" + n1);
System.out.println("n2=" + n2);
System.out.println("n3=" + n3);
System.out.println("n4=" + n4);
System.out.println(0x23A);
}
}进制的图示
| 十进制 | 十六进制 | 八进制 | 二进制 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 10 |
| 3 | 3 | 3 | 11 |
| 4 | 4 | 4 | 100 |
| 5 | 5 | 5 | 101 |
| 6 | 6 | 6 | 110 |
| 7 | 7 | 7 | 111 |
| 8 | 8 | 10 | 1000 |
| 9 | 9 | 11 | 1001 |
| 10 | A | 12 | 1010 |
| 11 | B | 13 | 1011 |
| 12 | C | 14 | 1100 |
| 13 | D | 15 | 1101 |
| 14 | E | 16 | 1110 |
| 15 | F | 17 | 1111 |
| 16 | 10 | 20 | 10000 |
| 17 | 11 | 21 | 10001 |
进制的转换(基本功)
进制转换的介绍
- 第一组:
- 二进制转十进制
- 八进制转十进制
- 十六进制转十进制
- 第二组:
- 十进制转二进制
- 十进制转八进制
- 十进制转十六进制
- 第三组:
- 二进制转八进制
- 二进制转十六进制
- 第四组:
- 八进制转二进制
- 十六进制转二进制
二进制转换成十进制示例
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。 案例:请将0b1011转成十进制的数
0b1011 = 1*2^(1-1) + 1*2^(2-1) + 0*2^(3-1) + 1*2^(4-1) = 1 + 2 + 0 + 8 = 11八进制转换成十进制示例
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和。 案例:请将0234转成十进制的数
0234 = 4*8^0 + 3*8^1 + 2*8^2 = 4 + 24 + 128 = 156十六进制转换成十进制示例
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。 案例:请将0x23A转成十进制的数
0x23A = 10*16^0 + 3*16^1 + 2*16^2 = 10 + 48 + 512 = 570课堂练习
请将以下进制转成十进制:
- 0b110001100
- 02456
- 0xA45
十进制转换成二进制
规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。 案例:请将34转成二进制 = 0B00100010
十进制转换成八进制
规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制。 案例:请将131转成八进制 => 0203
十进制转换成十六进制
规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。 案例:请将237转成十六进制 => 0xED
课堂练习
- 123转成二进制 => ?
- 678转成八进制 => ?
- 8912转成十六进制 => ?
二进制转换成八进制
规则:从低位开始,将二进制数每三位一组,转成对应的八进制数即可。 案例:请将0b11010101转成八进制
0b11(3) 010(2) 101(5) => 0325二进制转换成十六进制
规则:从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。 案例:请将0b11010101转成十六进制
0b1101(D) 0101(5) = 0xD5课堂练习
- 0b11100101转成八进制
- 0b1110010110转成十六进制
八进制转换成二进制
规则:将八进制数每1位,转成对应的一个3位的二进制数即可。 案例:请将0237转成二进制
02(010) 3(011) 7(111) = 0b10011111十六进制转换成二进制
规则:将十六进制数每1位,转成对应的4位的一个二进制数即可。 案例:请将0x23B转成二进制
0x2(0010) 3(0011) B(1011) = 0b001000111011课堂练习
- 01230转成二进制
- 0xAB29转成二进制
位运算的思考题
- 请看下面的代码段,回答a,b,c,d,e结果是多少?
public static void main(String[] args) {
int a=1>>2; // 1 向右位移2位
int b=-1>>2;//算术右移
int c=1<<2;//算术左移
int d=-1<<2;
int e=3>>>2;//无符号右移
//a,b,c,d,e 结果是多少
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);
System.out.println("d="+d);
System.out.println("e="+e);
}- 请回答在java中,下面的表达式运算的结果是:(位操作)
~2=? // 按位取反
2&3=?// 2 按位与3
2|3=?
~-5=?
13&7=?
5|4=?
-3^3=?//^ 按位异或二进制在运算中的说明
- 二进制是逢2进位的进位制,0、1是基本算符。
- 现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制规则是"逢2进1",数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。
原码、反码、补码(重点难点)
网上对原码,反码,补码的解释过于复杂,我这里精简几句话:(背下来) 对于有符号的而言:
- 二进制的最高位是符号位:0表示正数,1表示负数(老韩口诀:0->正,1->负)
- 正数的原码,反码,补码都一样(三码合一)
- 负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
- 负数的补码=它的反码+1,负数的反码=负数的补码-1
- 0的反码,补码都是0
- java没有无符号数,换言之,java中的数都是有符号的
- 在计算机运算的时候,都是以补码的方式来运算的
- 当我们看运算结果的时候,要看他的原码(重点)
位运算符
java中有7个位运算(&、|、^、~、>>、<<和>>>)
分别是按位与&、按位或|、按位异或^、按位取反~,它们的运算规则是:
- 按位与&:两位全为1,结果为1,否则为0
- 按位或|:两位有一个为1,结果为1,否则为0
- 按位异或^:两位一个为0,一个为1,结果为1,否则为0
- 按位取反~:0->1,1->0
比如:2&3=? ~-2=? ~2=? 2|3=? 2^3=? (BitOperator.java)
还有3个位运算符>>、<< 和>>>,运算规则:
- 算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
- 算术左移<<:符号位不变,低位补0
逻辑右移也叫无符号右移,运算规则是:低位溢出,高位补0
- 特别说明:没有<<<符号
应用案例
(BitOperator02.java)
int a=1>>2 ;// 1=>00000001=>00000000 本质 1/2/2=0int c=1<<2 ;// 1=>00000001=>00000100 本质 122=4
本章作业
- 计算下列表达式的结果
10/3=3; 10/5=2; 10%2=0; -10.5%3=?;
//a%b当a是小数时,公式=a-(int)a/b*b
//-10.5%3=-10.5-(-10)/3*3=-10.5+9=-1.5
//注意:有小数运算,得到结果是近似值- 试说出下面代码的结果
int i=66;
System.out.println(++i+i);//执行i=i+1=>i=67=>134在Java中,以下赋值语句正确的是(CD)。 A) int num1=(int)"18";//错误应该Integer.parseInt("18"); B) int num2=18.0;//错误double ->int C) double num3=3d; //ok D) double num4=8; //ok int -> double E) int i=48; char ch=i+1;//错误int ->char F) byte b = 19; short s = b+2;//错误int ->short
试写出将String转换成double类型的语句,以及将char类型转换成String的语句,举例说明即可,写简单代码
String str ="18.8";//注意字符串要可以被转成double
double d1 = Double.parseDouble(str);
char c1='韩';
String str2 = String.valueOf(c1); // 或 String str2 = c1 + "";